.. _cemHomeMove: cemHomeMove ============== -------------- SYNOPSYS ````````````` .. code-block:: none VT_I4 cemHomeMove( [in] VT_I4 Axis, [in] VT_I4 IsBlocking ) DESCRIPTION ````````````` - ì›ì 복귀 ìž‘ì—…ì„ ìˆ˜í–‰í•©ë‹ˆë‹¤. PARAMETER ````````````` - Axis : Axis : 축 번호. 통합 축으로 관리ë˜ëŠ” 축 번호를 ì˜ë¯¸í•˜ë©°, ìƒìˆ˜ 값으로 0 (Zero Based) ì´ìƒ, (최대 통합 축 개수 – 1) ì´í•˜ì˜ ê°’ì„ ì¶• 번호로 ì„¤ì •í• ìˆ˜ 있습니다. - IsBlocking : cemHomeMove í•¨ìˆ˜ì˜ ì¸ìžì´ë©°, 완료ë 때까지 기다리는 ë™ì•ˆ 윈ë„ìš° 메시지를 블ë¡(Blocking)í• ê²ƒì¸ì§€ë¥¼ ê²°ì •í•©ë‹ˆë‹¤. 단, ì“°ë ˆë“œë‚´ì—ì„œ ì‹¤í–‰í• ë•ŒëŠ” ì´ ê°’ì„ 1(CE_TRUE)ë¡œ ì„¤ì •í•´ 주어야 합니다. +--------------+----------------------------------------------------------------------------------------------------------------+ | Value | Meaning | +==============+================================================================================================================+ | 0 (CE_FALSE) | 윈ë„ìš° 메시지를 블ë¡(Blocking) 하지 않습니다. ë”°ë¼ì„œ 해당 ëª¨ì…˜ì´ ì§„í–‰ë˜ëŠ” ë™ì•ˆ 윈ë„ìš° ì´ë²¤íŠ¸ë¥¼ 처리합니다. | +--------------+----------------------------------------------------------------------------------------------------------------+ | 1 (CE_TRUE) | 윈ë„ìš° 메시지를 블ë¡(Blocking) 합니다. ë”°ë¼ì„œ 해당 ëª¨ì…˜ì´ ì™„ë£Œë˜ëŠ” ë™ì•ˆì—는 윈ë„ìš° ì´ë²¤íŠ¸ê°€ 처리ë˜ì§€ 않습니다. | +--------------+----------------------------------------------------------------------------------------------------------------+ RETURN VALUE ````````````` - 함수 수행 여부를 반환합니다. +----------------+-----------+ | Value | Meaning | +================+===========+ | ìŒìˆ˜ | 수행 실패 | +----------------+-----------+ | 0 (ceERR_NONE) | 수행 성공 | +----------------+-----------+ REFERENCE ``````````` - cemHomeMoveStart 함수를 사용하는 경우ì—는 cemHomeIsBusy, cemHomeWaitDone, cemHomeSuccess_Get 함수를 사용하여 ëª¨ì…˜ì˜ ì™„ë£Œë¥¼ 확ì¸í• 수 있습니다. \ - ccemHomeMove 함수를 사용하는 경우ì—는 내부ì 으로 루프를 수행하면서 ëª¨ì…˜ì´ ì™„ë£Œë˜ê¸°ë¥¼ 기다리는ë°, ì´ë•Œ ë¸”ë¡ ëª¨ë“œ(Blocking Mode) ì„¤ì •ì— ë”°ë¼ ìœˆë„ìš° ì´ë²¤íŠ¸ë¥¼ 처리하는 ë°©ì‹ì´ 달ë¼ì§‘니다. 그러나 ì¼ë°˜ì 으로 윈ë„ìš°ì˜ ìž‘ì—… ì“°ë ˆë“œ(Work Thread) ì—서는 ë¸”ë¡ ëª¨ë“œë¥¼ 사용하여, 함수 내부ì—ì„œ 지연 ì—†ì´ ì“°ë ˆë“œ ë‚´ë¶€ì˜ ìž‘ì—…ì— ì§‘ì¤‘í• ìˆ˜ 있ë„ë¡ ì„¤ì •í•˜ëŠ” ê²ƒì´ ë°”ëžŒì§í•©ë‹ˆë‹¤. \ - INP ìž…ë ¥ì‹ í˜¸ê°€ Enable ë¡œ ì„¤ì •ë˜ì—ˆìœ¼ë©´ Command 펄스 ì¶œë ¥ì´ ì™„ë£Œë˜ì–´ë„ INP ìž…ë ¥ì´ ON ì´ ë˜ê¸° ì „ê¹Œì§€ëŠ” ëª¨ì…˜ì´ ì™„ë£Œë˜ì§€ ì•Šì€ ê²ƒìœ¼ë¡œ 간주ë˜ì–´ 반환ë˜ì§€ 않습니다. \ - ìŠ¤í… ë“œë¼ì´ë²„를 사용 ì¤‘ì¸ ê³ ê°ë‹˜ë“¤ê»˜ì„œëŠ” 다ìŒì„ 참조해 주ì‹ì‹œì˜¤. ìŠ¤í… ë“œë¼ì´ë²„는 INP ì¶œë ¥ì´ ì—†ëŠ” 경우가 ì¼ë°˜ì ì¸ë°, ê³ ê°ë‹˜ì˜ 부주ì˜ë‚˜ ìž˜ëª»ëœ ì„¤ì •ìœ¼ë¡œ INP ìž…ë ¥ì— ëŒ€í•œ ì„¤ì •ì´ Enable ë¡œ ë˜ì–´ ìžˆì„ ê²½ìš° INP ìž…ë ¥ì´ ìŠ¤í… ë“œë¼ì´ë²„를 통해 ë°œìƒí•˜ì§€ 않는 ì´ìœ ë•Œë¬¸ì— ëª¨ì…˜ 완료가 ë˜ì§€ 않는 경우가 ë°œìƒí• 수 있습니다. ê³ ê° ì—¬ëŸ¬ë¶„ë“¤ê»˜ì„œëŠ” ìŠ¤í… ë“œë¼ì´ë²„ ì‚¬ìš©ì‹œì— ì´ì ì„ ì£¼ì˜í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤. \ - 서보 ë“œë¼ì´ë²„ì˜ LSP, LSN ì‹ í˜¸ë¥¼ 사용 ì¤‘ì¸ ê³ ê°ë‹˜ê»˜ì„œëŠ” 다ìŒì„ 참조해 주ì‹ì‹œì˜¤. 서보드ë¼ì´ë²„ì˜ ìž…ë ¥ ì‹ í˜¸ 중 í•˜ë‚˜ì¸ EL(End of Limit) ì‹ í˜¸ëŠ” ì €í¬ ãˆœ 커미조아 모션 컨트롤러ë¿ë§Œ ì•„ë‹ˆë¼ ì„œë³´ë“œë¼ì´ë²„ì—ë„ ì „ë‹¬ ë 수 있ë„ë¡ ì„¤ì •í• ìˆ˜ 있습니다. 통ìƒì 으로 LSP ì‹ í˜¸ì™€ LSN ì‹ í˜¸ë¡œ 불리어 지는 ì´ ì‹ í˜¸ëŠ” ì‹¤ì œ 기구물ì—ì„œ ì–‘ì˜ ë°©í–¥(Positive Direction) í˜¹ì€ ìŒì˜ ë°©í–¥(Negative Direction) ì— ìž¥ì°©ë˜ì–´ 있는 EL ì‹ í˜¸ë¥¼ 서보 ë“œë¼ì´ë²„ ì¸¡ì— ì „ë‹¬í•˜ê¸° 위한 ìš©ë„ë¡œ 사용ë©ë‹ˆë‹¤. 그러나, 모션 소프트웨어ì—ì„œ INP ì„¤ì •ì´ ë˜ì–´ 있는 경우 EL ì‹ í˜¸ê°€ 검출 ëœ í›„ì— ì¼ë¶€ 서보 ë“œë¼ì´ë²„ ì—서는 진행 ë°©í–¥ì—ì„œ ì •ì§€í•œ 후 ë” ì´ìƒ 움ì§ì´ì§€ 않는 ìƒí™©ì´ ë°œìƒí•˜ë©°, ì´ ìƒí™©ì—ì„œ INP ì‹ í˜¸ê°€ ì¶œë ¥ë˜ì§€ ì•Šì•„, 모션 ì´ì†¡ì´ 완료ë˜ì§€ ëª»í•˜ê³ , 명시ì 으로 STOP ëª…ë ¹ì„ í†µí•´ ê°•ì œì 으로 ëª¨ì…˜ì„ ì¢…ë£Œí•´ì•¼ ë˜ëŠ” 현ìƒì´ ë°œìƒí• 수 있습니다. ì´ í˜„ìƒì€ EL 모드를 통해 ì›ì 복귀를 하는 ìƒí™©ì—ì„œë„ ë°œìƒí• 수 있습니다. ë”°ë¼ì„œ, ì´ëŸ¬í•œ 경우ì—는 반드시 ì›ì 복귀나 EL 검출 ì‹œì— ì¸í„°ëŸ½íŠ¸ ì´ë²¤íŠ¸ë‚˜ 타ì´ë¨¸ë¥¼ 통해 INP 를 무기한 대기하는 현ìƒì— 대해서 ì ì ˆížˆ 대처하시거나 INP ì‹ í˜¸ ì‚¬ìš©ì„ ë°°ì œ 해야 합니다. .. note:: 윈ë„ìš° ì´ë²¤íŠ¸ë¼ëŠ” ê²ƒì€ ë¬´ì—‡ìž…ë‹ˆê¹Œ? 윈ë„ìš° ìš´ì˜ì²´ì œëŠ” Event Driven í˜¹ì€ Message Driven ë°©ì‹ì˜ 구조로 ë˜ì–´ìžˆìŠµë‹ˆë‹¤. ê° ì‘ìš© í”„ë¡œê·¸ëž¨ì€ ë©”ì‹œì§€ í(Queue)를 ê°€ì§€ê³ ìžˆìœ¼ë©°, ì •í™•ížˆ ë§í•˜ë©´, 메시지를 사용해 ì´ë²¤íŠ¸ë¥¼ 통지하는 ë°©ì‹ìœ¼ë¡œ 설계ë˜ì–´ 있습니다. 윈ë„ìš° 메시지를 처리한다는 ê²ƒì€ ë©”ì‹œì§€ íì—ì„œ 메시지를 하나씩 꺼내서 윈ë„ìš° í”„ë¡œì‹œì €ì— ì „ì†¡í•œë‹¤ëŠ” ê²ƒì„ ì˜ë¯¸í•˜ë©°, ì´ê²ƒì€ ê·¸ í–‰ì„ ì§€ê°€ ë˜ëŠ” 윈ë„ìš°ì— ì „ì†¡ë˜ì–´ 처리ë©ë‹ˆë‹¤. EXAMPLE ``````````` .. code-block:: c++ :linenos: :emphasize-lines: 5 C/C++ #include “ceSDK.h†#include “ceSDKDef.h†/********************************************************************* * ì›ì 복귀 í™˜ê²½ì„ ì„¤ì •í•©ë‹ˆë‹¤. *********************************************************************/ void OnSetHomeConfig () { /* ì›ì 복귀 í™˜ê²½ì„ ì›ì 복귀 모드 = 0, ë°©í–¥ = (-), Ez Count = 0, ì›ì 탈출 거리 = 10, Offset = 0 으로 ì„¤ì •í•©ë‹ˆë‹¤. */ cemHomeConfig_Set ( cemX1, 0, cemDIR_N, 0, 10, 0 ); cemHomeConfig_Set ( cemY1, 0, cemDIR_N, 0, 10, 0 ); /* ì›ì 복귀 ì†ë„ í™˜ê²½ì„ ì„¤ì •í•©ë‹ˆë‹¤. */ cemHomeSpeedPattern_Set ( cemX1, cemSMODE_S, 1000, 10000, 10000, 10 ); cemHomeSpeedPattern_Set ( cemY1, cemSMODE_S, 1000, 10000, 10000, 10 ); } /********************************************************************* * ì›ì 복귀 ì´ì†¡ì„ 수행합니다. *********************************************************************/ void OnHomeReturn () { long nIsHomming = CE_TRUE; // ì›ì 복귀 진행 ìƒíƒœ ì •ë³´ /* cemHomeIsBusy() ëª…ë ¹ì„ í†µí•œ ì›ì 복귀 완료 ì²´í¬ */ if ( cemHomeMoveStart ( cemX1 ) == ceERR_NONE ) { While ( nIsHomming ) { cemHomeIsBusy ( cemX1, &nIsHomming ); // 0 (CE_FALSE) : ì›ì 복귀 ì´ì†¡ ìž‘ì—…ì´ ì§„í–‰ì¤‘ì´ì§€ 않습니다. // 1 (CE_TRUE) : ì›ì 복귀 ì´ì†¡ ìž‘ì—…ì´ ì§„í–‰ì¤‘ìž…ë‹ˆë‹¤. } } // cemHomeWaitDone() ëª…ë ¹ì„ í†µí•œ ì›ì 복귀 완료 ì²´í¬. if ( cemHomeMoveStart ( cemY1 ) == ceERR_NONE ) { cemHomeWaitDone ( cemY1, CE_FALSE ); // ì›ì 복귀 완료 시까지 대기합니다. } // cemHomeMoveStart(), cemHomeWaitDone() ì„ ì•„ëž˜ 코드로 대체 í• ìˆ˜ 있습니다. // cemHomeMove ( cemY1, CE_FALSE ); } /********************************************************************* * ì›ì 복귀 성공 여부를 확ì¸í•©ë‹ˆë‹¤. *********************************************************************/ void OnGetHomeSuccess () { long nIsSuccess; // ì›ì 복귀 성공 여부를 확ì¸í•©ë‹ˆë‹¤. cemHomeSuccess_Get ( cemX1, &nIsSuccess ); if ( nIsSuccess == CE_TRUE ) { // ì›ì 복귀가 성공했ìŒì„ ì˜ë¯¸í•©ë‹ˆë‹¤. } } .. code-block:: none :linenos: Visual Basic ‘ ============================================== ‘ ì›ì 복귀 í™˜ê²½ì„ ì„¤ì •í•©ë‹ˆë‹¤. ‘============================================== Private Sub OnSetHomeConfig () ‘ ì›ì 복귀 í™˜ê²½ì„ ì›ì 복귀 모드 = 0, ë°©í–¥ = (-), Ez Count = 0, ‘ ì›ì 탈출 거리 = 10, Offset = 0 으로 ì„¤ì •í•©ë‹ˆë‹¤. Call cemHomeConfig_Set ( cemX1, 0, cemDIR_N, 0, 10, 0 ) Call cemHomeConfig_Set ( cemY1, 0, cemDIR_N, 0, 10, 0 ) ‘ ì›ì 복귀 ì†ë„ í™˜ê²½ì„ ì„¤ì •í•©ë‹ˆë‹¤. Call cemHomeSpeedPattern_Set ( cemX1, cemSMODE_S, 1000, 10000, 10000, 10 ) Call cemHomeSpeedPattern_Set ( cemY1, cemSMODE_S, 1000, 10000, 10000, 10 ) End Sub ‘ ============================================== ‘ ì›ì 복귀 ì´ì†¡ì„ 수행합니다. ‘ ============================================== Private OnHomeReturn () Dim nIsHomming As Long ‘ ì›ì 복귀 진행 ìƒíƒœ ì •ë³´ nIsHomming = CE_TRUE ‘ cemHomeIsBusy() ëª…ë ¹ì„ í†µí•œ ì›ì 복귀 완료 ì²´í¬ If cemHomeMoveStart ( cemX1 ) = ceERR_NONE Then While ( nIsHomming = CE_TRUE ) ‘ 0 (CE_FALSE) : ì›ì 복귀 ì´ì†¡ ìž‘ì—…ì´ ì§„í–‰ì¤‘ì´ì§€ 않습니다. ‘ 1 (CE_TRUE) : ì›ì 복귀 ì´ì†¡ ìž‘ì—…ì´ ì§„í–‰ì¤‘ìž…ë‹ˆë‹¤. Call cemHomeIsBusy ( cemX1, nIsHomming ) Wend End If ‘ cemHomeWaitDone() ëª…ë ¹ì„ í†µí•œ ì›ì 복귀 완료 ì²´í¬. If cemHomeMoveStart ( cemY1 ) = ceERR_NONE Then Call cemHomeWaitDone ( cemY1, CE_FALSE ) ‘ ì›ì 복귀 완료 시까지 대기합니다. End If ‘ cemHomeMoveStart(), cemHomeWaitDone() ì„ ì•„ëž˜ 코드로 대체 í• ìˆ˜ 있습니다. ‘ cemHomeMove( cemY1, CE_FALSE ) End Sub ‘ ============================================== ‘ ì›ì 복귀 성공 여부를 확ì¸í•©ë‹ˆë‹¤. ‘ ============================================== Private Sub OnGetHomeSuccess () Dim nIsSuccess As Long ‘ ì›ì 복귀 성공 여부 ì •ë³´. ‘ ì›ì 복귀 성공 여부를 확ì¸í•©ë‹ˆë‹¤. Call cemHomeSuccess_Get ( cemX1, nIsSuccess ) ‘ ì›ì 복귀 성공 메시지를 표시합니다. If nIsSuccess = CE_TRUE Then MsgBox ( "Home return success" ) End If End Sub .. code-block:: none :linenos: Delphi // ******************************************************************** // ì›ì 복귀 í™˜ê²½ì„ ì„¤ì •í•©ë‹ˆë‹¤. // ******************************************************************** procedure OnSetHomeConfig (); begin { ì›ì 복귀 í™˜ê²½ì„ ì›ì 복귀 모드 = 0, ë°©í–¥ = (-), Ez Count = 0, ì›ì 탈출 거리 = 10, Offset = 0 으로 ì„¤ì •í•©ë‹ˆë‹¤. } cemHomeConfig_Set ( cemX1, 0, cemDIR_N, 0, 10, 0 ); cemHomeConfig_Set ( cemY1, 0, cemDIR_N, 0, 10, 0 ); // ì›ì 복귀 ì†ë„ í™˜ê²½ì„ ì„¤ì •í•©ë‹ˆë‹¤. cemHomeSpeedPattern_Set ( cemX1, cemSMODE_S, 1000, 10000, 10000, 10 ); cemHomeSpeedPattern_Set ( cemY1, cemSMODE_S, 1000, 10000, 10000, 10 ); end; // ******************************************************************** // ì›ì 복귀 ì´ì†¡ì„ 수행합니다. // ******************************************************************** procedure OnHomeReturn (); var nIsHomming : LongInt // ì›ì 복귀 진행 ìƒíƒœ ì •ë³´ begin // cemHomeIsBusy() ëª…ë ¹ì„ í†µí•œ ì›ì 복귀 완료 ì²´í¬ if cemHomeMoveStart ( cemX1 ) = ceERR_NONE then begin nIsHomming := CE_TRUE; while nIsHomming = CE_TRUE do begin { 0 (CE_FALSE) : ì›ì 복귀 ì´ì†¡ ìž‘ì—…ì´ ì§„í–‰ì¤‘ì´ì§€ 않습니다. 1 (CE_TRUE) : ì›ì 복귀 ì´ì†¡ ìž‘ì—…ì´ ì§„í–‰ì¤‘ìž…ë‹ˆë‹¤. } cemHomeIsBusy ( cemX1, @nIsHomming ); end; end; // cemHomeWaitDone() ëª…ë ¹ì„ í†µí•œ ì›ì 복귀 완료 ì²´í¬. if cemHomeMoveStart ( cemY1 ) = ceERR_NONE then begin cemHomeWaitDone ( cemY1, CE_FALSE ); // ì›ì 복귀 완료 시까지 대기합니다. end // cemHomeMoveStart(), cemHomeWaitDone() ì„ ì•„ëž˜ 코드로 대체 í• ìˆ˜ 있습니다. // cemHomeMove( cemY1, CE_FALSE ); end; // ******************************************************************** // ì›ì 복귀 성공 여부를 확ì¸í•©ë‹ˆë‹¤. // ******************************************************************** procedure OnGetHomeSuccess (); var nIsSuccess : LongInt // ì›ì 복귀 성공 여부 ì •ë³´. begin // ì›ì 복귀 성공 여부를 확ì¸í•©ë‹ˆë‹¤. cemHomeSuccess_Get ( cemX1, @nIsSuccess ); // ì›ì 복귀 성공 메시지를 표시합니다. if nIsSuccess = CE_TRUE then begin ShowMessage ( ‘Home return success’ ); end; end; .. seealso:: :ref:`cemHomeMoveStart`